home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / demo.exe / DEMOS.INC < prev    next >
Text File  |  1992-02-16  |  8KB  |  339 lines

  1. ; ----------------------------
  2. ; DEMOS.INC        - allgemeine Routinen für die Demos
  3. ;
  4.  
  5. ; ----------------------------
  6. ; ShowLogo
  7. ;
  8. ; Funktion: Ausgabe des Logos und verkleinern des akt. Speicherblocks auf
  9. ;           1 Segment
  10. ;
  11. ; Eingabe:  ES = DS = CS
  12. ;
  13. ShowLogo:
  14.          mov ax,0
  15.          jmp >l1
  16.  
  17. ; ----------------------------
  18. ; ShowLogoAndAsk
  19. ;
  20. ; Funktion: Ausgabe des Logos, verkleinern des akt. Speicherblocks auf
  21. ;           1 Segment und Lesen einer Taste
  22. ;
  23. ; Eingabe:  ES = DS = CS
  24. ;
  25. ; Bes.:     Falls die Taste <ESC> eingegeben wird, wird das Programm
  26. ;           abgebrochen. (Errorlevel = 1)
  27. ;
  28. MakeMsg AbbortMsg,      '*** Programm abgebrochen.'
  29.  
  30. ShowLogoAndAsk:
  31.          mov ax,01
  32.  
  33. l1:
  34.          push ax
  35.  
  36.          Write_String Logo    ; Logo ausgeben
  37.  
  38.                               ; akt. Speicherblock verkleinern
  39.          mov bx,01000h
  40.          mov ah,04Ah
  41.          int 021h             ; (keine Fehlerbehandlung)
  42.  
  43.          pop ax               ; AX = 0 ->> keine Taste lesen
  44.                               ; AX = 1 ->> Taste lesen
  45.          or ax,ax
  46.          jz ret               ; keine Taste lesen
  47.  
  48.          cmp b[019h],01
  49.          jne ret              ; Umleitung der Standard-Ausgabe in Kraft
  50.  
  51. ; ----------------------------
  52.          mov ah,01h           ; Taste lesen
  53.          int 021h
  54.          cmp al,ESC
  55.          jne >l1
  56.                               ; ESC gedrückt, Programm abbrechen
  57.          Write_String AbbortMsg
  58.  
  59.          EndProcess 01        ; *** Programm abbrechen!
  60.  
  61. ; ------------------
  62. l1:
  63.          cmp al,00h           ; Funktionstaste eingegeben?
  64.          jne >l2
  65.  
  66.          mov ah,01h           ; ja, zweiten Code lesen
  67.          int 021h
  68. ; ----------------------------
  69. l2:
  70.          call ShowCR_LF
  71.          ret
  72.  
  73. ; ----------------------------
  74. ; CloseFiles
  75. ;
  76. ; Funktion: Schließt alle offenen Dateien
  77. ;
  78. CloseFiles:
  79.          pushf
  80.          push ax,bx,cx,si,ds
  81.          cld
  82.          mov cx,cs:[032h]     ; CX = Anzahl möglicher Handles
  83.          lds si,cs:[034h]     ; DS:SI -> Handle-Tabelle
  84.          xor bx,bx
  85.  
  86. l00:
  87.          lodsb                ; AL = akt. internes Handle
  88.          cmp al,0FFh
  89.          je >l01              ; Handle ist geschlossen
  90.  
  91.                               ; Handle schließen
  92.          mov ah,03Eh
  93.          int 021h
  94. l01:
  95.          inc bx
  96.          loop l00
  97.  
  98.          pop ds,si,cx,bx,ax
  99.          popf
  100.          ret
  101.  
  102. ; ----------------------------
  103. ; LaufzeitAnzeige
  104. ;
  105. ; Funktion: Ausgabe einer Laufzeit-Anzeige
  106. ;
  107. PunktZaehler  db 0
  108. Punkt         db CR,'.-'
  109.  
  110. LaufzeitAnzeige:
  111.          cmp b cs:[019],01
  112.          jne ret              ; Laufzeitausgabe nicht ausgeben, falls die
  113.                               ; Standard-Ausgabe umgeleitet wird
  114.  
  115.          push ds,bx,cx,dx     ; Laufzeitangabe ausgeben
  116.          push cs
  117.          pop ds
  118.  
  119.          mov cx,1
  120.          mov dx,offset Punkt+1
  121.  
  122.          inc PunktZaehler
  123.          cmp PunktZaehler,40xD
  124.          jb >l1
  125.                               ; Cursor zurücksetzen
  126.          mov cx,2
  127.          dec dx
  128.          mov ax,W Punkt+1
  129.          xchg ah,al
  130.          mov W Punkt+1,ax
  131.          mov PunktZaehler,0
  132. l1:
  133.          call OutputMsg
  134.          pop dx,cx,bx,ds
  135.          ret
  136.  
  137. ; ----------------------------
  138. ; OutputMsg
  139. ;
  140. ; Funktion:  Ausgabe einer Zeichenkette auf das Handle Standard-Error
  141. ;
  142. ; Eingabe:   DX = Offset der Zeichenkette
  143. ;            CX = Länge der Zeichenkette
  144. ;
  145. OutputMsg:
  146.          push ax,bx,ds
  147.          mov ds,cs
  148.          mov ah,040h
  149.          mov bx,STDOut
  150.          int 021h
  151.          pop ds,bx,ax
  152.          ret
  153.  
  154. ; ----------------------------
  155. ; ShowCR_LF
  156. ;
  157. ; Funktion: Ausgabe von CR und LF
  158. ;
  159. MakeMsg1 CR_LF ,CR,LF
  160.  
  161. ShowCR_LF:
  162.          push cx,dx
  163.          mov dx,offset CR_LF
  164.          mov cx,CR_LF_Length
  165.          call OutputMsg
  166.          pop dx,cx
  167.          ret
  168.  
  169. ; ----------------------------
  170. ; ShowPause
  171. ;
  172. ; Funktion: Gibt eine Meldung auf die Standard-Ausgabe aus und wartet auf
  173. ;           eine Taste (nur falls die Ausgabe auf den Bildschirm geht)
  174. ;
  175. ; Ausgabe:  CF = 0 -> Taste <> ESC gedrückt
  176. ;           CF = 1 -> ESC gedrückt
  177. ;           AL = Taste
  178. ;
  179. MakeMsg1 PauseMSG, CR,LF, 'Bitte eine Taste drücken (ESC = Ende) ...'
  180.  
  181. ShowPause:
  182.          push ds
  183.          push bx,cx,dx
  184.  
  185.          cmp b cs:[019h],01h  ; [019h] -> Handle für die Standard-Ausgabe
  186.          clc
  187.          jne >l9              ; Ausgabe geht in eine Datei
  188.  
  189.          mov ds,cs
  190.                               ; Meldung ausgeben
  191.          WRITE_STRING PauseMSG
  192.  
  193. l0:
  194.          mov ah,08h           ; Zeichen lesen
  195.          int 021h
  196.          cmp al,0             ; Funktionstaste gedrückt ?
  197.          je l0                ; ja, zweiten Code lesen
  198.  
  199.          cmp al,ESC
  200.          clc
  201.          if e stc
  202.          pushf
  203.          call ShowCR_LF
  204.          popf
  205.  
  206. l9:
  207.          pop dx,cx,bx
  208.          pop ds
  209.          ret
  210.  
  211. ; ----------------------------
  212. ; Konvert_AX_To_HexString
  213. ;
  214. ; Funktion:  Konvertiert AX zu eine 4-stellige Zeichenkette in Hexadezimal-
  215. ;            Form nach ES:DI
  216. ;
  217. ; Eingabe:   AX = Zu konvertierender Wert
  218. ;            ES:DI -> Puffer für 4 Zeichen
  219. ;
  220. ; Ausgabe:  Puffer gefüllt
  221. ;           DI zeigt hinter den Puffer
  222. ;
  223. Konvert_AX_To_HexString:
  224.          push ax
  225.          mov al,ah
  226.          call Konvert_AL_To_Hexstring
  227.          pop ax
  228.          ; ...
  229.  
  230. ; ----------------------------
  231. ; Konvert_AL_To_Hexstring
  232. ;
  233. ; Funktion:  Konvertiert AL in eine 2-stellige Zeichenkette in Hexadezimal-
  234. ;            Form nach ES:DI
  235. ;
  236. ; Eingabe:   AL = zu konvertierenden Wert
  237. ;            ES:DI -> Puffer für 2 Zeichen
  238. ;
  239. ; Ausgabe:   Puffer gefüllt
  240. ;            DI zeigt hinter den Puffer
  241. ;
  242. Konvert_AL_To_HexString:
  243.          cld
  244.          mov ah,al
  245.          and ah,0F0h
  246.          shr ah,1
  247.          shr ah,1
  248.          shr ah,1
  249.          shr ah,1
  250.          cmp ah,9
  251.          jg >l1
  252.          add ah,'0'
  253.          jmp >l2
  254. l1:
  255.          add ah,'7'
  256. l2:
  257.          and al,00Fh
  258.          cmp al,9
  259.          jg >l1
  260.          add al,'0'
  261.          jmp >l2
  262. l1:
  263.          add al,'7'
  264. l2:
  265.          xchg ah,al
  266.          stosw
  267.          ret
  268.  
  269. ; ----------------------------
  270. ; Konvert_AL_To_Dezstring
  271. ;
  272. ; Funktion: Konvertiert (vorzeichenlos) AL zu einem Dezimal-String bei ES:DI
  273. ;
  274. ; Eingabe:  AL = zu konvertierender Wert
  275. ;
  276. ; Ausgabe:  Dezstring bei ES:DI
  277. ;
  278. Konvert_AL_To_Dezstring:
  279.          push cx,dx
  280.          xor ah,ah
  281.          mov dx,ax
  282.          mov cs:k1,ah
  283.          jmp >l1
  284.  
  285. ; ----------------------------
  286. ; Konvert_AX_To_Dezstring
  287. ;
  288. ; Funktion: Konvertiert (vorzeichenlos) AX zu einem Dezimal-String bei ES:DI
  289. ;
  290. ; Eingabe:  AX = zu konvertierender Wert
  291. ;
  292. ; Ausgabe:  Dezstring bei ES:DI
  293. ;
  294.  
  295. k1       db 0                 ; Hilfsvariable
  296.  
  297.  
  298. StoreDigit0:
  299.          mov ax,dx
  300.  
  301. StoreDigit1:
  302.          xor dx,dx
  303.          div cx
  304.          cmp al,0
  305.          jne >l01
  306.          cmp cs:k1,al
  307.          jne >l01
  308.          mov al,' '
  309.          jmp >l02
  310. l01:
  311.          add al,'0'
  312.          mov cs:k1,al
  313. l02:
  314.          stosb
  315.          ret
  316.  
  317. Konvert_AX_To_Dezstring:
  318.          push cx,dx
  319.  
  320.          mov cs:k1,0
  321.  
  322.          mov cx,10000xD
  323.          call StoreDigit1
  324.          mov cx,1000xD
  325.          call StoreDigit0
  326. l1:
  327.          mov cx,100xD
  328.          call StoreDigit0
  329.          mov cx,10xD
  330.          call StoreDigit0
  331.          mov al,dl
  332.          add al,'0'
  333.          stosb
  334.  
  335.          pop dx,cx
  336.          ret
  337.  
  338.  
  339.